package com.example.exam001.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.example.exam001.domain.DictOption;
import com.example.exam001.domain.dto.DictOptionDto;
import com.example.exam001.domain.dto.DictOptionWrapDto;
import com.example.exam001.service.impl.impl.DictOptionServiceImpl;
import com.example.exam001.vo.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@RestController
@RequestMapping("/dict-options")
@Slf4j
public class DictOptionController {
    @Autowired
    private DictOptionServiceImpl dictOptionsService;

    /**
     * 创建字典选项
     *
     * @param dictOptionDto 包含字典选项的数据传输对象
     * @return 响应成功的消息
     */
    @PostMapping
    public Object create(@RequestBody DictOptionDto dictOptionDto) {
        // 记录查询条件
        log.info("dictOptionDto = " + dictOptionDto);

        // 保存字典选项到数据库
        dictOptionsService.save(dictOptionDto.getDictOptions());
        return R.success();
    }

    /**
     * 查询字典选项
     *
     * @param conditions 查询条件
     * @return 查询结果列表
     */
    @GetMapping
    public Object query(@RequestParam Map<String, String> conditions) {
        if (conditions.isEmpty()) {
            return R.error();
        }
        // 记录查询条件
        log.info("conditions = " + conditions);

        // 初始化查询父选项的 QueryWrapper
        QueryWrapper<DictOption> queryWrapperParent = new QueryWrapper<>();

        // 查询符合条件的父选项
        if (!conditions.isEmpty()) {
            conditions.forEach((key, value) -> {
                queryWrapperParent.or().eq("dict_code", value);
            });
        }

        // 初始化字典选项包装类列表
        Map<String, DictOptionWrapDto> dictOptionWrapDtoList = new HashMap<>();

        // 查询父选项列表
        List<DictOption> parentList = dictOptionsService.list(queryWrapperParent);

        // 遍历父选项列表
        parentList.forEach(it -> {
            // 创建字典选项包装类实例，并将其添加到列表中
            dictOptionWrapDtoList.put(it.getDictCode(), new DictOptionWrapDto() {{
                // 查询子选项
                List<DictOption> child = dictOptionsService.list(
                        new QueryWrapper<DictOption>().
                                eq("parent_id", it.getId())
                );
                // 复制父选项属性到包装类实例
                BeanUtils.copyProperties(it, this);
                // 将子选项设置到父选项的 child 属性中
                setChildren(child);
            }});
        });

        // 返回查询结果作为响应数据
        return R.success(new HashMap<>() {{
            put("conditions", dictOptionWrapDtoList);
        }});
    }

}
